#pragma once
#include "DError.h"

namespace Skill
{
	namespace Ode
	{
		void ErrorReport(int errnum, const char *msg, va_list ap)
		{			
				String^ message = nullptr;
				if(msg)
					message = gcnew String(msg);
				DError::Raise_ErrorHandler(errnum,message);
		}
		void DebugReport(int errnum, const char *msg, va_list ap)
		{			
				String^ message = nullptr;
				if(msg)
					message = gcnew String(msg);
				DError::Raise_DebugHandler(errnum,message);
		}

		void MessageReport(int errnum, const char *msg, va_list ap)
		{			
				String^ message = nullptr;
				if(msg)
					message = gcnew String(msg);
				DError::Raise_MessageHandler(errnum,message);
		}

		DError::DError()
		{
			dSetErrorHandler(ErrorReport);
			dSetDebugHandler(DebugReport);
			dSetMessageHandler(MessageReport);
		}

		void DError::GenerateError (int errNum, String^ msg, System::Object^ data)
		{
			_ErrorObj = data;
			if(!String::IsNullOrEmpty(msg))
			{
				STRINGTO_CONSTCHAR_ANSI(m,msg);
				dError(errNum,m,0);
				FREECHARPOINTER(m);
			}
			else dError(errNum,0,0);			
		}
		void DError::GenerateDebug (int errNum, String^ msg, System::Object^ data)
		{
			_DebugObj = data;
			if(!String::IsNullOrEmpty(msg))
			{
				STRINGTO_CONSTCHAR_ANSI(m,msg);
				dDebug(errNum,m,0);
				FREECHARPOINTER(m);
			}
			else dDebug(errNum,0,0);			
		}
		void DError::GenerateMessage (int errNum, String^ msg, System::Object^ data)
		{
			_MessageObj = data;
			if(!String::IsNullOrEmpty(msg))
			{
				STRINGTO_CONSTCHAR_ANSI(m,msg);
				dMessage(errNum,m,0);
				FREECHARPOINTER(m);
			}
			else dMessage(errNum,0,0);			
		}
	}
}